#define _CRT_SECURE_NO_WARNINGS  1
//一定要动手，例子不管多么简单，建议至少自己手敲一遍看看是否理解了里头的细枝末节。
//一定要学会思考，思考为什么要这样，而不是那样。还要举一反三地思考
#include"Double_List.h"
ListNode* ListCreate()
{
	ListNode* head = (ListNode*)malloc(sizeof(ListNode));
	if (head == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	head->_next = head;
	head->_prev = head;
	return head;
}
ListNode* BuyListNode(LTDataType x)
{
	ListNode* head = (ListNode*)malloc(sizeof(ListNode));
	if (head == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	head->_next = NULL;
	head->_prev = NULL;
	head->_data = x;
	return head;
}
void ListDestory(ListNode* pHead)
{
	assert(pHead);
	ListNode* cur = pHead->_next;
	while (cur != pHead)
	{
		ListNode* next = cur->_next;
		free(cur);
		cur = next;
	}
	free(pHead);
}
void ListPrint(ListNode* pHead)
{
	assert(pHead);
	ListNode* cur = pHead->_next;
	while (cur != pHead)
	{
		printf("%d ", cur->_data);
		cur = cur->_next;
	}
	printf("\n");
}
void ListPushBack(ListNode* pHead, LTDataType x)
{
	assert(pHead);
	ListNode* node = BuyListNode(x);
	ListNode* tail = pHead->_prev;
	//pHead       tail   node
	node->_next = pHead;
	pHead->_prev = node;

	tail->_next = node;
	node->_prev = tail;
}
void ListPopBack(ListNode* pHead)
{
	assert(pHead);
	ListNode* tail = pHead->_prev;
	ListNode* tailprev = tail->_prev;
	//pHead       tailprev     tail
	tailprev->_next = pHead;
	pHead->_prev = tailprev;
	free(tail);
}
void ListPushFront(ListNode* pHead, LTDataType x)
{
	assert(pHead);

	ListNode* node = BuyListNode(x);
	node->_next = pHead->_next;
	pHead->_next->_prev = node;

	pHead->_next = node;
	node->_prev = pHead;
}
void ListPopFront(ListNode* pHead)
{
	assert(pHead);
	ListNode* tmp = pHead->_next;
	ListNode* tail = pHead->_next->_next;
	pHead->_next = tail;
	tail->_prev = pHead;
	free(tmp);
}
ListNode* ListFind(ListNode* pHead, LTDataType x)
{
	assert(pHead);
	ListNode* cur = pHead->_next;
	while (cur!=pHead)
	{
		if (cur->_data == x)
		{
			return cur;
		}
		cur = cur->_next;
	}
	return NULL;
}
void ListInsert(ListNode* pos, LTDataType x)
{
	assert(pos);
	ListNode* node = BuyListNode(x);
	ListNode* prev = pos->_prev;
	//prev  node   pos
	prev->_next = node;
	node->_prev = prev;
	node->_next = pos;
	pos->_prev = node;
}
void ListErase(ListNode* pos)
{
	assert(pos);
	ListNode* prev = pos->_prev;
	ListNode* next = pos->_next;
	//prev  pos  next
	prev->_next = next;
	next->_prev = prev;
	free(pos);
}

//
//
//
//
//#define _CRT_SECURE_NO_WARNINGS  1
////一定要动手，例子不管多么简单，建议至少自己手敲一遍看看是否理解了里头的细枝末节。
////一定要学会思考，思考为什么要这样，而不是那样。还要举一反三地思考
//#include"Double_List.h"
//ListNode* BuyListNode(LTDataType x)
//{
//	ListNode* node = (ListNode*)malloc(sizeof(ListNode));
//	if (node == NULL)
//	{
//		perror("malloc fail");
//		exit(-1);
//	}
//	node->_next = NULL;
//	node->_prev = NULL;
//	node->_data = x;
//	return node;
//}
//ListNode* ListCreate()
//{
//	ListNode* head = (ListNode*)malloc(sizeof(ListNode));
//	if (head == NULL)
//	{
//		perror("malloc fail");
//		exit(-1);
//	}
//	head->_next = head;
//	head->_prev = head;
//	return head;
//}
//void ListDestory(ListNode* pHead)
//{
//	assert(pHead);
//	ListNode* cur = pHead;
//	while (cur != pHead)
//	{
//		ListNode* next = cur->_next;
//		free(cur);
//		cur = next;
//	}
//	free(pHead);
//}
//
//void ListPrint(ListNode* pHead)
//{
//	assert(pHead);
//	ListNode* cur = pHead->_next;
//	while (cur != pHead)
//	{
//		printf("%d ", cur->_data);
//		cur = cur->_next;
//	}
//	printf("\n");
//}
//void ListPushBack(ListNode* pHead, LTDataType x)
//{
//	assert(pHead);
//	ListNode* node = BuyListNode(x);
//	ListNode* tail = pHead->_prev;
//	//pHead            tail    node
//	tail->_next = node;
//	node->_prev = tail;
//
//	node->_next = pHead;
//	pHead->_prev = node;
//}
//void ListPopBack(ListNode* pHead)
//{
//	assert(pHead);
//	ListNode* tail = pHead->_prev;
//	ListNode* tailprev = tail->_prev;
//	//pHead            tailprev  tail
//	tailprev->_next = pHead;
//	pHead->_prev = tailprev;
//	free(tail);
//}
//void ListPushFront(ListNode* pHead, LTDataType x)
//{
//	assert(pHead);
//	ListNode* node = BuyListNode(x);
//	node->_next = pHead->_next;
//	pHead->_next->_prev = node;
//
//	node->_prev = pHead;
//	pHead->_next = node;
//}
//void ListPopFront(ListNode* pHead)
//{
//	assert(pHead);
//	pHead->_next = pHead->_next->_next;
//	pHead->_next->_next->_prev = pHead;
//}
//ListNode* ListFind(ListNode* pHead, LTDataType x)
//{
//	assert(pHead);
//	ListNode* tail = pHead->_next;
//	while (tail != pHead)
//	{
//		if (tail->_data == x)
//		{
//			return tail;
//		}
//		tail = tail->_next;
//	}
//	return NULL;
//}
//void ListInsert(ListNode* pos, LTDataType x)
//{
//	assert(pos);
//	ListNode* prev = pos->_prev;
//	//prev  node pos
//	ListNode* node = BuyListNode(x);
//	prev->_next = node;
//	node->_prev = prev;
//
//	node->_next = pos;
//	pos->_prev = node;
//}
//void ListErase(ListNode* pos)
//{
//	assert(pos);
//	ListNode* prev = pos->_prev;
//	// prev   pos  
//	prev->_next = pos->_next;
//	pos->_next->_prev = prev;
//	free(pos);
//}